DCM(Diagnostic Communication Manager)是AUTOSAR(汽车开放系统架构)基础软件BSW中服务层(Service Layer)的核心模块,其核心功能是为车辆电子控制单元(ECU)提供符合行业标准(如ISO 14229 UDS、ISO 15765 DoCAN、ISO 15031 OBD等)的诊断服务支持,为开发和生产阶段提供与诊断仪交互的诊断服务,如下图所示
其主要功能包括:
DCM模块由三个子模块构成,分别是DSL(DiagnosticSession layer)、DSD(Diagnostic Service Dispatcher)、DSP(Diagnostic Service Processing),如下图所示,接下来将针对三个子模块功能进行讲解
DSL模块主要用于诊断请求的处理及诊断时序的控制,管理诊断状态(诊断会话和安全状态)等,具体存在几个功能如下:
处理诊断请求:收到请求时,PduR会调用Dcm_StartOfReception()和Dcm_CopyRxData()接口将诊断请求数据从下层的Buffer中Copy到DCM的接收Buffer中。PduR调用Dcm_TpRxIndication()接口通知Dcm模块接收到了新的诊断请求
处理诊断响应:当需要响应诊断请求时,DLS通过调用通过调用PduR_DcmTransimit()和Dcm_CopyTxData()接口,将数据传递至PduR中,其中PduR_DcmTransimit()接口只是传递长度信息、地址信息,数据是通过Dcm_CopyTxData()接口传递至PduR,当数据传输成功后,PduR通过调用Dcm_TpTxConfirmation()接口告知DCM数据接收成功。
管理安全等级:通过Dcm_GetSecurityLevel()和DslInternal_SetSecurityLevel()两个接口分别用于获取当前的安全等级和设置安全等级
在配置层面,DSL(Diag Session Layer)的配置参数主要包括以下几个方面:
1. 诊断帧配置:涵盖物理寻址和功能寻址的设置
2. 通信缓冲区配置:定义单次通信中允许的最大Buffer大小
3. 时间参数配置:
回复0x78的时间设置
为防止诊断服务异常,允许0x78的最大次数。
这些参数的合理配置对于确保诊断通信的稳定性和可靠性至关重要。
DSD模块主要用于诊断服务的分配、服务执行环境及条件,会从接收的数据识别请求的服务类型(如0x10、0x27、0x22等),主要功能如下:
检查诊断服务:当诊断会话层(DSL)接收到新的诊断请求时,它会通过内部接口通知诊断服务调度器(DSD),如图所示。DSD 会调用 Dcm_GetSesCtrlType()和 Dcm_GetSecurityLevel()接口,以获取当前的会话类型和安全等级。接着,DSD 会在当前会话的“服务标识符表”中检查诊断请求的服务标识符(SID)是否存在于表中。如果 SID 不在表中,DSD 将发送否定响应码(NRC)0x7F;如果诊断服务本身是支持的,但当前会话不支持该子服务,DSD 将发送 NRC 0x7E。随后,DSD 会检查当前的安全等级是否满足执行该诊断请求的条件。如果当前安全等级不支持该诊断请求,DSD 将发送 NRC 0x33。最后,DSD 会检查诊断请求数据的长度,以确保其符合要求。
汇总响应数据:当DSP模块完成诊断请求处理后,DSD负责将整理响应数据。并发送至DSL,由DSL向外发送数据。DSD将服务标识符(SID)(如果是负反馈,则为0x7F)和响应的数据流添加至Dcm_MsgContextType。然后DSD将其传送至缓冲区,并在缓冲区的第一个字节添加SID
对于配置而言,DSD 的配置主要涉及定义支持的诊断服务、这些服务所支持的会话类型和安全等级,以及其他相关参数。通过合理的配置,DSD 能够确保诊断服务的正确性和安全性,满足不同场景下的诊断需求
DSP用于实现不同服务的处理,当接收到DSD请求处理诊断服务,服务处理过程如下所示:
分析接收的请求数据,调用不同的诊断服务实现函数
检查格式以及是否支持所寻址的子功能
获取数据或者调用DEM、SWC或者其他BSW模块的接口。比如0x22和0x2E服务需要调用SWC的数据接口进行读写;0x28需要调用BswM的逻辑实现关闭不同的CAN报文;0x19服务需要调用DEM模块获取快照数据和扩展数据(如下图红框部分)
汇总响应数据,将数据发送给DSD
在配置过程中,DSP(Diagnostic Service Processor)模块的配置项较为复杂,主要包括以下内容:
DID 的实现
DcmDspData:用于配置 DID 的数据类型、数据长度以及接口类型。
DcmDspDidInfo:用于配置 DID 的读写功能。
DcmDspDids:汇总 DcmDspDidInfo 和 DcmDspData,并添加 DID 值。
安全等级的实现
包括种子和密钥的位数、最大错误访问次数以及时间参数。
Session 的配置
包括 Session 的等级、是否支持跳转至 Boot 模式以及时间参数 P2 ServeMax 和 P2* ServeMax。
以10服务的会话切换请求为例,DCM实现逻辑如下所示:
PduR会先调用Dcm_StartOfReception向DCM模块请求buffer,确定当前可以用于接收的Buffer的大小用于计算传输层的Block Size
调用Dcm_CopyRxData(),用于接收I-PDU数据;
PduR会调用Dcm_TpRxIndication()用于通知接收数据是否成功;
DCM中的DSL将会话请求发送至DSD;
DCM中的DSD对请求进行校验,校验通过后会进一步分发至DSP,并在DSP中进行处理;
当I-PDU经过Tp模块发送完成后,PduR通过Dcm_TpTxIndication()接口可以确认数据发送是否成功。
以2E服务的写VIN码请求为例,DCM实现逻辑如下所示:
服务调度:DSD 检查请求的有效性,并将请求转发给 DSP。
数据处理:DSP 调用 VIN 码写入接口,将 VIN 码写入 ECU 存储单元。
发送响应:DSP 将处理结果返回给 DSD,DSD 通过 DSL 将响应报文发送给 PduR,最终由 PduR 传递给上层应用。
DCM模块主要实现UDS和OBD诊断服务,但是DCM跟其他模块的交互比较频繁,想要了解诊断服务的机制需要其他模块配合,比如BswM、DEM、EcuM以及SWC等。